package Day_0219.Redis;

/**
 * @author zxc
 * @date 2023/02/19 22:52
 **/
public class Redis_Persistence {
    public static void main(String[] args) {
        /**
         * Redis的持久化方式
         * ===》
         * 一，Redis中数据需要进行持久化的目的
         * 1.持久化，主要是做灾难恢复、数据恢复，也可以归类到高可用的一个环节中去，
         * 比如 ：redis 整个挂了，然后 redis 就不可用了，你要做的事情就是让 redis 变得可用，尽快变得可用。
         * 重启 redis，尽快让它对外提供服务，如果没做数据备份，这时候 redis 启动了，也不可用啊，数据都没了。
         *
         * 2.很可能说，大量的请求过来，缓存全部无法命中，在 redis 里根本找不到数据，出现缓存雪崩问题。
         * 所有请求没有在redis命中，就会去mysql数据库这种数据源头中去找，mysql承接高并发。
         *
         * 3.如果你把 redis 持久化做好，备份和恢复方案做到企业级的程度，
         * 即使你的 redis 故障了，也可以通过备份数据，快速恢复，一旦恢复立即对外提供服务
         *
         * 二，Redis的持久化方式
         * redis 持久化的两种方式
         * 1.RDB：
         * RDB 持久化机制，是对 redis 中的数据执行 周期性持久化。
         * ===》
         * RDB持久化机制，会将redis中的所有数据进行持久化
         *
         * 2.AOF：
         * AOF机制对 每条写入命令作为日志，以 append-only 的模式写入一个日志文件中，
         * 在 redis重启的时候，可以通过回放 AOF 日志中的写入指令,来重新构建整个数据集。
         * ===》
         * AOF持久化机制，是对于Redis中每条执行的命令进行持久化;
         *
         * 3.通过 RDB 或 AOF，都可以将 redis 内存中的数据给持久化到磁盘上面来，
         * 然后可以将这些数据备份到别的地方去，比如说阿里云等云服务。
         * 如果 redis 挂了，服务器上的内存和磁盘上的数据都丢了，可以从云服务上拷贝回来之前的数据，放到指定的目录中，
         * 然后重新启动 redis，redis 就会自动根据持久化数据文件中的数据，去恢复内存中的数据，继续对外提供服务。
         *
         * 4.如果同时使用 RDB 和 AOF 两种持久化机制，
         * 那么在 redis 重启的时候，会使用 AOF 来重新构建数据，因为 AOF 中的数据更加完整。
         * ===》
         * 若是Redis在数据恢复的时候，采用RDB && AOF两种持久化机制的话，则会优先采用AOF文件进行redis数据恢复;
         *
         * 三，RDB和AOF的优缺点
         * 1.RDB 优缺点
         * （1）RDB 会生成多个数据文件，每个数据文件都代表了某一个时刻中 redis 的数据（即，快照 Snapshot）
         * 这种多个数据文件的方式，非常适合做冷备，可以将这种完整的数据文件发送到一些远程的安全存储上去，
         * 比如说Amazon的 S3 云服务上去，在国内可以是阿里云的 ODPS 分布式存储上，
         * 以预定好的备份策略来定期备份 redis中的数据。
         *
         * （2）RDB 对 redis 对外提供的读写服务，影响非常小，可以让 redis 保持高性能，
         *  因为 redis 主进程只需要 fork 一个子进程，让子进程执行磁盘 IO 操作来进行 RDB 持久化即可。·
         *
         * （3）相对于 AOF 持久化机制来说，直接基于 RDB 数据文件来重启和恢复 redis 进程，更加快速。
         *
         * （4）如果想要在 redis 故障时，尽可能少的丢失数据，那么 RDB 没有 AOF 好。
         * 一般来说，RDB 数据快照文件，都是每隔 5 分钟，或者更长时间生成一次，
         * 这个时候就得接受一旦 redis 进程宕机，那么会丢失最近 5 分钟的数据。
         *
         * （5）RDB 每次在 fork 子进程，来执行 RDB 快照数据文件生成的时候，
         * 如果数据文件特别大，可能会导致对客户端提供的服务暂停数毫秒，或者甚至数秒。
         * ===》
         * 总结 ：
         * （1）RDB持久化机制，会去fork一个子进程，异步地去持久化Redis中的数据，对于Redis本身性能的影响较小
         * （2）RDB持久化机制，一旦redis出现宕机，则可能会丢失更多的数据;
         * （3）恢复redis中数据，采用RDB数据文件的话，则会比使用AOF数据文件更加高效;
         *
         * 2.AOF 优缺点
         * （1）AOF 可以更好的保护数据不丢失，
         *  一般 AOF 会每隔 1 秒，通过一个后台线程执行一次 fsync 操作，最多丢失 1 秒钟的数据。
         *
         * （2）AOF 日志文件以 append-only 模式写入;
         *  所以没有任何磁盘寻址的开销，写入性能非常高，而且文件不容易破损，即使文件尾部破损，也很容易修复。
         *
         * （3）AOF 日志文件，即使过大的时候，出现后台AOF重写操作，也不会影响客户端的读写。
         *  在 rewrite log的时候，会对其中的指令进行压缩，创建出一份需要恢复数据的最小日志出来。
         *  在创建新日志文件的时候，redis所执行的命令还是写入老日志文件。
         *  当新的merge后 日志文件ready的时候，直接交换新老日志文件即可。
         *
         * （4）AOF 日志文件的命令，通过非常可读的方式进行记录，这个特性非常适合做灾难性的误删除的紧急恢复。
         *  比如某人不小心用 flushall 命令清空了所有数据，只要这个时候后台 rewrite 还没有发生，
         *  那么就可以立即拷贝 AOF 文件，将最后一条 flushall 命令给删了，
         *  然后再将该 AOF 文件放回去，就可以通过恢复机制，自动恢复所有数据。
         *
         * （5）对于同一份数据来说，AOF 日志文件通常比 RDB 数据快照文件更大。
         *
         * （6）AOF 开启后，支持的写 QPS 会比 RDB 支持的写 QPS 低，
         *  因为 AOF 一般会配置成每秒 fsync 一次日志文件，当然，每秒一次 fsync，性能也还是很高的。
         *  （如果实时写入，那么 QPS 会大降，redis 性能会大大降低）
         *
         * （7）以前 AOF 发生过 bug，就是通过 AOF 记录的日志，进行数据恢复的时候，没有恢复一模一样的数据出来。
         *  所以说，类似 AOF 这种较为复杂的基于命令日志 / merge / 回放的方式，
         *  比基于 RDB 每次持久化一份完整的数据快照文件的方式，更加脆弱一些，容易有 bug。
         *  ===》
         *  AOF 就是为了避免rewrite 过程导致的 bug，因此每次 rewrite 并不是基于旧的指令日志进行 merge 的，
         *  而是基于当时内存中的数据进行指令的重新构建，这样健壮性会好很多。
         *
         * 四，如何选择合适的数据持久化机制
         * （1）不要仅仅使用 RDB，因为那样会导致你丢失很多数据;
         * ===》
         * 总结 ：
         * 即，使用RDB持久化机制，导致redis中数据持久化不够实时;
         *
         * （2）也不要仅仅使用 AOF，因为那样有两个问题：
         *  第一，你通过 AOF 做冷备，没有使用 RDB 做冷备来的恢复速度更快；
         *  第二，RDB 每次简单粗暴生成数据快照，更加健壮，可以避免 AOF 这种复杂的备份和恢复机制的 bug；
         *  ===》
         *  总结 ：
         * （1）即，RDB数据文件所生成的redis中数据快照，比AOF文件中所记录的redis所执行命令，恢复速度更快;
         * （2）同时，RDB数据文件由于是直接记录某一时刻redis中数据，而并不像AOF文件去记录redis执行的每一行命令;
         *  所以，RDB持久化方式相比于AOF持久化方式，是更加健壮的;
         *
         */
    }
}
